#ifndef F28004X_H
#define F28004X_H

#ifdef __cplusplus
extern "C" {
#endif

//
// Common CPU Definitions:
//

// #ifndef __TMS320C28XX__
// #define __cregister
// #endif  //__TMS320C28xx__
//
// extern __cregister volatile unsigned int IFR;
// extern __cregister volatile unsigned int IER;

#define EINT (ExpRegs.INTM = 0)
#define DINT (ExpRegs.INTM = 1)
#define ERTM
#define DRTM

#ifndef EALLOW
#define EALLOW // __eallow()
#endif         // EALLOW

#ifndef EDIS
#define EDIS   // __edis()
#endif         // EDIS
#define ESTOP0 // __asm(" ESTOP0")

#define M_INT1  0x0001
#define M_INT2  0x0002
#define M_INT3  0x0004
#define M_INT4  0x0008
#define M_INT5  0x0010
#define M_INT6  0x0020
#define M_INT7  0x0040
#define M_INT8  0x0080
#define M_INT9  0x0100
#define M_INT10 0x0200
#define M_INT11 0x0400
#define M_INT12 0x0800
#define M_INT13 0x1000
#define M_INT14 0x2000
#define M_DLOG  0x4000
#define M_RTOS  0x8000

#define BIT0  0x00000001
#define BIT1  0x00000002
#define BIT2  0x00000004
#define BIT3  0x00000008
#define BIT4  0x00000010
#define BIT5  0x00000020
#define BIT6  0x00000040
#define BIT7  0x00000080
#define BIT8  0x00000100
#define BIT9  0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000
#define BIT16 0x00010000
#define BIT17 0x00020000
#define BIT18 0x00040000
#define BIT19 0x00080000
#define BIT20 0x00100000
#define BIT21 0x00200000
#define BIT22 0x00400000
#define BIT23 0x00800000
#define BIT24 0x01000000
#define BIT25 0x02000000
#define BIT26 0x04000000
#define BIT27 0x08000000
#define BIT28 0x10000000
#define BIT29 0x20000000
#define BIT30 0x40000000
#define BIT31 0x80000000

//
// For Portability, User Is Recommended To Use the C99 Standard integer types
//
#include <assert.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

//
// C++ Bool Compatibility
//
#if defined(__cplusplus)
typedef bool _Bool;
#endif

//
// C99 defines boolean type to be _Bool, but this doesn't match the format of
// the other standard integer types.  bool_t has been defined to fill this gap.
//
typedef _Bool bool_t;

//
// Used for a bool function return status
//
typedef _Bool status_t;

#ifndef SUCCESS
#define SUCCESS true
#endif

#ifndef FAIL
#define FAIL false
#endif

//
// The following data types are included for compatibility with legacy code,
// they are not recommended for use in new software.  Please use the C99
// types included above
//

// #ifdef __TMS320C28XX_CLA__
// typedef short int16;
// typedef long int32;
// typedef unsigned char Uint8;
// typedef unsigned short Uint16;
// typedef unsigned long Uint32;
// typedef float float32;
// typedef long double float64;
// typedef struct
//{
//     Uint32 low32;
//     Uint32 high32;
// } Uint64;
// typedef struct
//{
//     int32 low32;
//     int32 high32;
// } int64;
// #else  // __TMS320C28XX__

typedef signed char int8;
typedef signed short int16;
typedef signed int int32;
typedef signed long long int64;

typedef unsigned char Uint8;
typedef unsigned short Uint16;
typedef unsigned int Uint32;
typedef unsigned long long Uint64;
typedef float float32;
typedef long double float64;
// #endif //__TMS320C28XX_CLA__

//
// The following data types are for use with byte addressable peripherals.
// See compiler documentation on the byte_peripheral type attribute.
//
// #ifndef __TMS320C28XX_CLA__
typedef unsigned short bp_16;
typedef unsigned int bp_32;
// #endif

#ifndef __interrupt
#define __interrupt __attribute__((interrupt)) __attribute__((section(".text.interrupt.routine")))
#endif

//
// Include All Peripheral Header Files:
//
#include "f28004x_adc.h"
#include "f28004x_analogsubsys.h"
#include "f28004x_cmpss.h"
#include "f28004x_cputimer.h"
#include "f28004x_dac.h"
#include "f28004x_dma.h"
#include "f28004x_ecap.h"
#include "f28004x_epwm.h"
#include "f28004x_epwm_xbar.h"
#include "f28004x_eqep.h"
#include "f28004x_erad.h"
#include "f28004x_flash.h"
#include "f28004x_fsi.h"
#include "f28004x_gpio.h"
#include "f28004x_i2c.h"
#include "f28004x_input_xbar.h"
#include "f28004x_output_xbar.h"
#include "f28004x_pga.h"
#include "f28004x_piectrl.h"
#include "f28004x_pievect.h"
#include "f28004x_pmbus.h"
#include "f28004x_sci.h"
#include "f28004x_sdfm.h"
#include "f28004x_spi.h"
#include "f28004x_sysctrl.h"
#include "f28004x_xbar.h"
#include "f28004x_xint.h"
#include "f28004x_canfd.h"
#include "f28004x_dcc.h"
#include "f28004x_lin.h"
#include "f28004x_ipc.h"
#include "f28004x_tracebuffer.h"
#include "f28004x_watchpoint.h"

#ifdef __cplusplus
}
#endif /* extern "C" */

#endif // end of F28004X_DEVICE_H definition
